home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -in_the_mag- / reader_requests / scilab / demos / velpic / testpt.f < prev    next >
Text File  |  1999-09-16  |  3KB  |  81 lines

  1.       subroutine testpt(p1,p2,nc,xyline,flag,count,bav)
  2. c <flag,bav>=testpoint(p1,p2,line)
  3. c <flag,bav>=testpoint(p1,p2,line)
  4. c macro which tests whether the line segment defined by the
  5. c two points p1 and p2 intersects any of the line segments
  6. c in line.
  7. c  p1   :2x1 matrix giving the indices of point number one
  8. c  p2   :2x1 matrix giving the indices of point number two
  9. c  line :2xN matrix giving the indices of a line
  10. c  flag :flag='on' indicates an intersection, flag='off' 
  11. c       :indicates no intersection
  12. c  bav  :3xM matrix giving all the intersections found (if any)
  13. c       :and the position in the line of the intersection
  14. c!
  15. c author: C. Bunks     date: 12-NOV-90
  16. c /two line segments defined by (p1,p2) and (q1,q2)
  17. c have a point in common if there exists two constants
  18. c a and b such that 0<=a<=1 and 0<=b<=1 
  19. c and 
  20. c                (1-a)*p1+a*p2=(1-b)*q1-b*q2
  21. c or 
  22. c                                 [b]              
  23. c                [(q2-q1) (p1-p2)][ ] = (p1-q1)
  24. c                                 [a]              
  25. c NOTE: Could return the wrong value when the line segment
  26. c passes through an end point of the line sequence. Thus
  27. c all line segments on a grid point must be perturbed.
  28.  
  29.       integer      nc,flag,count
  30.       real         bav(3,nc),xyline(2,nc)
  31.       real         p1,p2,pd,q1
  32.       real         q2,qd,vec,ba,detm
  33.       dimension    p1(1,2),p2(1,2),pd(1,2),q1(1,2)
  34.       dimension    q2(1,2),qd(1,2),vec(1,2),ba(1,2)
  35.  
  36.       count=0
  37.       do 10 k=1,nc-1
  38.          q1(1,1)=xyline(1,k)
  39.          q1(1,2)=xyline(2,k)
  40.          q2(1,1)=xyline(1,k+1)
  41.          q2(1,2)=xyline(2,k+1)
  42.          if(int(q1(1,1)).eq.q1(1,1).and.int(q1(1,2)).eq.q1(1,2))then
  43.             q1(1,1)=q1(1,1)+.001
  44.             q1(1,2)=q1(1,2)+.001
  45.          endif
  46.          if(int(q2(1,1)).eq.q2(1,1).and.int(q2(1,2)).eq.q2(1,2))then
  47.             q2(1,1)=q2(1,1)+.001
  48.             q2(1,2)=q2(1,2)+.001
  49.          endif             
  50.          qd(1,1)=q1(1,1)-q2(1,1)
  51.          qd(1,2)=q1(1,2)-q2(1,2)
  52.          pd(1,1)=p1(1,1)-p2(1,1)
  53.          pd(1,2)=p1(1,2)-p2(1,2)
  54.  
  55.          detm=-qd(1,1)*pd(1,2)+qd(1,2)*pd(1,1)
  56.          if(detm.ne.0)then
  57.             vec(1,1)=p1(1,1)-q1(1,1)
  58.             vec(1,2)=p1(1,2)-q1(1,2)
  59.             ba(1,1)=(pd(1,2)*vec(1,1)-pd(1,1)*vec(1,2))/detm
  60.             ba(1,2)=(qd(1,2)*vec(1,1)-qd(1,1)*vec(1,2))/detm
  61.  
  62.             if(0.le.ba(1,1).and.ba(1,1).le.1.and.
  63.      +         0.le.ba(1,2).and.ba(1,2).le.1)then
  64.                count=count+1
  65.                bav(1,count)=(1-ba(1,2))*p1(1,1)+ba(1,2)*p2(1,1)
  66.                bav(2,count)=(1-ba(1,2))*p1(1,2)+ba(1,2)*p2(1,2)
  67.                bav(3,count)=k
  68.             endif
  69.          endif
  70.  10   continue
  71.  
  72. c if the number of intersections is odd then an intersection
  73. c occured
  74.  
  75.       if(int(count/2).ne.float(count)/2.) flag=1
  76.  
  77.       return
  78.       end
  79.